package core;


import fileoperation.FileCreation;
import gitobject.Blob;
import gitobject.Tree;
import repository.Repository;

import java.io.File;
import java.io.IOException;

public class JitHash {
    /**
     * Todo: You should pass the filename in this function, and generate a hash file in your repository.
     * @param filename
     * @throws IOException
     */
    // git-hash-object命令，指令用于计算一个ojbect的Id值（对应着Blob反序列化的id值？）
    // 执行后会向Git中写入一个包含其内容的新 blob 对象
    // 即传递文件名，创建git object对象，并计算其哈希值创建文件进行命名，在文件内部写入序列化压缩后的内容
    // 计算哈希值时，遇到file时，创建blob对象，遇到dir时，创建tree对象，生成路径为gitDir/Objects/...
    public static void hash(String filename) throws Exception {
        File file = new File(Repository.getWorkTree() + File.separator + filename);
        // 判断是文件还是文件夹
        if (file.isFile()) {
            // 如果是文件，那么根据文件地址创建blob实例对象
            Blob blob = new Blob(file);
            // 在.jit版本库objects里创建对应的blob文件，blob文件夹用sha1哈希值的前两位命名
            FileCreation.createDirectory(blob.getPath(),blob.genKey(file).substring(0,2));
            // 内部文件用sha1哈希值的后38位命名
            FileCreation.createFile(blob.getPath()+File.separator+blob.genKey(file).substring(0,2),blob.genKey(file).substring(2),"");
            // 写入
            blob.compressWrite();
            // 输出”10644 blob 哈希值“
            System.out.println(blob);
        } else if (file.isDirectory()) {
            // 如果是文件夹，那么创建树对象
            Tree tree = new Tree(file);
            // 在.jit版本库objects里创建对应的tree文件，tree文件夹用sha1哈希值的前两位命名
            FileCreation.createDirectory(tree.getPath(),tree.getKey().substring(0,2));
            // 内部文件用sha1哈希值的后38位命名
            FileCreation.createFile(tree.getPath()+File.separator+tree.getKey().substring(0,2),tree.getKey().substring(2),"");
            // 写入
            tree.compressWrite();
            System.out.println(tree);

            File[] fs = file.listFiles();
            // 继续遍历文件夹内部的文件
            for(int i = 0 ; i<fs.length ; i++){
                // 递归内部文件的hash操作
                hash(file.getName()+File.separator+fs[i].getName());
            }
        } else {
            throw new IOException("The path is not a directory or file!");
        }
    }
}
